這個各位可能會比較少使用到,建議還是了解一下
widget
有三個屬性是沒有看過原始碼,會比較難知道的
xmlDependencies
jsLibs
cssLibs
這三個屬性會在 willStart
階段才載入
我們可以看一下核心 widget 的程式
// addons/web/static/src/js/core/widget.js
/**
* Method called between @see init and @see start. Performs asynchronous
* calls required by the rendering and the start method.
*
* This method should return a Promose which is resolved when start can be
* executed.
*
* @returns {Promise}
*/
willStart: function () {
var proms = [];
if (this.xmlDependencies) {
proms.push.apply(proms, _.map(this.xmlDependencies, function (xmlPath) {
return ajax.loadXML(xmlPath, core.qweb);
}));
}
if (this.jsLibs || this.cssLibs || this.assetLibs) {
proms.push(this._loadLibs(this));
}
return Promise.all(proms);
},
眼尖的各位一定注意到
剛剛提到的三個屬性都在這段程式中出現
而為什麼會說是 lazy load 呢?
各位可以思考一下,在有定義新的 JS 或 CSS/SCSS 時
是不是會到 assets.xml
來註冊到 assets_backend
或其他的 bundle 的模板
在 odoo 的 bundle 是把所有程式集中成一包
而且只有針對換行省略,並沒有做編譯的縮小化
因此 bundle 的內容會越來越大包
如果這時註冊了一個 JS lib 有 1MB+,那麼 bundle 的內容也會增加差不多相同的流量
各位應該有好奇過為什麼 odoo 第一次進畫面這麼慢
就有可能是 bundle 的資源包蠻大的,可以開啟開發者工具的 Network
頁面來觀察
回到正題,在剛剛的例子中,可以發現 bundle 越來越大包
但有些 widget 所需要的 js libs,可能是只有在某幾個功能或是特定時間點才會使用到
因此可以將其定義在三個屬性中,讓使用到 widget 的時候才載入
減少網頁第一次進入時要下載很大的 bundle 資源